package com.biubiu.biubiuexam.controller;


import cn.dev33.satoken.stp.StpUtil;
import com.biubiu.biubiuexam.common.dto.LoginDto;
import com.biubiu.biubiuexam.common.dto.RegisterDto;
import com.biubiu.biubiuexam.common.lang.Result;
import com.biubiu.biubiuexam.services.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;


/**
 * 账户相关 Controller
 */
@RestController
public class AccountController {

    private final AccountService accountService;

    /**
     * 自动装配构造函数
     *
     * @param accountService AccountService 的实例
     */
    @Autowired
    public AccountController(AccountService accountService) {
        this.accountService = accountService;
    }


    /**
     * 注册接口
     *
     * @param registerDto 注册所需信息
     * @return 注册结果 result
     */
    @PostMapping("/register")
    public Result register(@Valid @RequestBody RegisterDto registerDto) {
        if (StpUtil.isLogin()) {
            return Result.fail(402, "已经登录！", null);
        }

        return accountService.register(registerDto);

    }

    /**
     * 登录接口
     *
     * @param loginDto 登录所需信息
     * @return 登录结果 result
     */
    @PostMapping("/login")
    public Result login(@Valid @RequestBody LoginDto loginDto) {

        if (StpUtil.isLogin()) {
            return Result.fail(402, "已经登录！", null);
        }

        return accountService.login(loginDto);
    }

    /**
     * 检查是否已登录接口
     *
     * @return 是否登录 result
     */
    @GetMapping("/isLogin")
    public Result isLogin() {
        if (StpUtil.isLogin()) {
            return Result.success(200, "已登录！", StpUtil.getTokenInfo());
        } else {
            return Result.fail(200, "未登录！", null);
        }
    }

    /**
     * 登出接口
     *
     * @return 登出结果 result
     */
    @PostMapping("/logout")
    public Result logout() {
        if (!StpUtil.isLogin()) {
            return Result.fail(402, "未登录！", null);
        }
        StpUtil.logout();
        return Result.success(null);
    }

    /**
     * 获取某用户的信息
     *
     * @param email 用户 邮箱
     * @return 查询结果 user info
     */
    @GetMapping("/getUserInfo")
    public Result getUserInfo(@RequestParam String email) {
        if (!StpUtil.isLogin()) {
            return Result.fail(402, "未登录！", null);
        }
        return accountService.getUserInfo(email);
    }

    /**
     * 获取自己的信息
     *
     * @return 查询结果 user info
     */
    @GetMapping("/getMyUserInfo")
    public Result getMyUserInfo() {
        if (!StpUtil.isLogin()) {
            return Result.fail(402, "未登录！", null);
        }
        return accountService.getMyUserInfo(StpUtil.getLoginIdAsLong());
    }

    /**
     * 检查自己是否拥有某身份
     *
     * @param role 身份
     * @return 结果
     */
    @GetMapping("/isRole")
    public Result isRole(@RequestParam String role) {
        if (!StpUtil.isLogin()) {
            return Result.fail(402, "未登录！", null);
        }
        return accountService.isRole(role);
    }
}
